import asyncio
import time
from typing import Tuple, Callable
from .通用 import UDP服务器信息
from .UDP消息 import UDP消息, UDP消息类型


class UDP心跳:
    def __init__(
            self,
            会话ID: int,
            地址: Tuple[str, int] | None = None) -> None:
        self.会话ID = 会话ID
        self.心跳间隔 = UDP服务器信息.心跳间隔
        self.地址 = 地址
        self.心跳发送时间辍 = time.time()
        self.心跳接收时间辍 = time.time()
        self.消息 = UDP消息(UDP消息类型.心跳, 会话ID, 地址=地址)

    def 刷新发送(self):
        self.心跳发送时间辍 = time.time()

    def 刷新接收(self):
        self.心跳接收时间辍 = time.time()

    async def __call__(self, 状态检测: Callable, 消息发送: Callable, 关闭会话: Callable):
        while True:
            状态检测()
            当前时间 = time.time()
            if 当前时间 - self.心跳发送时间辍 > self.心跳间隔:
                消息发送(self.消息)
                self.心跳发送时间辍 = 当前时间
            if 当前时间 - self.心跳接收时间辍 > self.心跳间隔 * 2:
                break
            await asyncio.sleep(1)
        关闭会话()
